package com.szgz.platform.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.szgz.platform.model.TaskStep;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

import java.util.List;

/**
 * 任务步骤Mapper接口
 */
@Mapper
public interface TaskStepMapper extends BaseMapper<TaskStep> {

    /**
     * 分页查询任务的步骤列表
     *
     * @param page 分页参数
     * @param taskId 任务ID
     * @param status 步骤状态
     * @return 分页结果
     */
    IPage<TaskStep> selectStepsByTaskId(Page<TaskStep> page, 
                                       @Param("taskId") Long taskId, 
                                       @Param("status") String status);

    /**
     * 查询任务的所有步骤（树形结构）
     *
     * @param taskId 任务ID
     * @param status 步骤状态
     * @return 步骤列表
     */
    List<TaskStep> selectStepsTreeByTaskId(@Param("taskId") Long taskId, 
                                          @Param("status") String status);

    /**
     * 查询步骤的子步骤
     *
     * @param parentStepId 父步骤ID
     * @param status 步骤状态
     * @return 子步骤列表
     */
    List<TaskStep> selectChildrenByParentId(@Param("parentStepId") Long parentStepId, 
                                           @Param("status") String status);

    /**
     * 查询步骤的父步骤
     *
     * @param stepId 步骤ID
     * @return 父步骤
     */
    TaskStep selectParentByStepId(@Param("stepId") Long stepId);

    /**
     * 查询步骤的依赖步骤
     *
     * @param stepId 步骤ID
     * @return 依赖步骤列表
     */
    List<TaskStep> selectDependenciesByStepId(@Param("stepId") Long stepId);

    /**
     * 查询步骤的依赖步骤
     *
     * @param stepId 步骤ID
     * @return 依赖步骤列表
     */
    List<TaskStep> selectDependentsByStepId(@Param("stepId") Long stepId);

    /**
     * 更新步骤顺序
     *
     * @param stepId 步骤ID
     * @param newOrder 新顺序
     * @return 影响行数
     */
    int updateStepOrder(@Param("stepId") Long stepId, @Param("newOrder") Integer newOrder);

    /**
     * 查询任务中指定类型的步骤
     *
     * @param taskId 任务ID
     * @param stepType 步骤类型
     * @param status 步骤状态
     * @return 步骤列表
     */
    List<TaskStep> selectStepsByType(@Param("taskId") Long taskId, 
                                    @Param("stepType") String stepType, 
                                    @Param("status") String status);

    /**
     * 统计任务的步骤数量
     *
     * @param taskId 任务ID
     * @param status 步骤状态
     * @return 步骤数量
     */
    int countStepsByTaskId(@Param("taskId") Long taskId, @Param("status") String status);

    /**
     * 查询用户可访问的步骤
     *
     * @param taskId 任务ID
     * @param userId 用户ID
     * @param status 步骤状态
     * @return 步骤列表
     */
    List<TaskStep> selectAccessibleSteps(@Param("taskId") Long taskId, 
                                        @Param("userId") Long userId, 
                                        @Param("status") String status);
} 